//
//  LWComposeTextView.swift
//  LW_Weibo
//
//  Created by 刘伟 on 16/7/18.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit

//封装  这个类 以后抽调出来  我们可以在任何地方使用 所以我们不能依赖其他第三方框架 用系统的方法

//让我们这个类可以在xib中使用  也即是只要在xib中关联我们这个类 那么就会显示占位符  让我们这个类和系统的UITextField有一样的功能


//实时查看Xib设置的属性
//加上这个关键字后,我们在Xib中设置属性都能监听到
@IBDesignable
class LWComposeTextView: UITextView {

    //MARK: - xib中添加占位符属性
    //  占位文字
    //  给xib添加设置属性 @IBInspectable这个关键字 一定要加上
    @IBInspectable var placeHolder: String? { //在xib 中 输入placeHolder 的内容  我们将placeHolder的内容 赋值给占位符placeHolderLabel  placeHolder这个属性暴露在外面,我们的占位符就可以不用暴露在外面了  所以我们只需要输入字符串 就会给我们的占位符 赋值
        
        didSet {
            
            
            //和UITextField的placeHolder一样  只要我们在xib中输入placeHolder的内容 xib中就会显示出来
            placeHolderLabel.text = placeHolder
            
            
        }
        
    }
    

    
    
    //MARK: - 懒加载一个占位符 
    //模仿UITextFile中的占位符placeHolder 我们在这里创建一个 
    //placeHolder是一个UILabel
    private lazy var placeHolderLabel: UILabel = {
        
       let label = UILabel()
        
        label.font = UIFont.systemFontOfSize(14)
        
        //设一个默认内容
        label.text = "请输入你想发表的内容"
        
        //设置多行显示
        label.numberOfLines = 0
        
        //设置颜色  一般默认是亮灰色  当然我们也可以自己在外面改
        label.textColor = UIColor.lightGrayColor()
        
        return label
        
    }()
    
    
    
    //当用户输入的文本font改变时  我们同时需要改变placeHolderLabel的font font 是UITextView的属性 而用户改变文本的font  就会走 didSet 方法  相当于OC里面的 set 方法  赋值
    
    //重写font  set方法
    override var font: UIFont? {
        
        //只要改变font  就会走这个方法  那么我们在这里面将外面设置的font  赋值个我们自定义的占位符placeHolderLabel的font 即可
        didSet {
            
            //如果外界传入nil  那么就直接显示默认的  即直接return
            
            if font == nil {
                
                return
                
            }
            
            
            placeHolderLabel.font = font
            
            
        }
        
        
        
    }
    
    
    //重写 text  因为当我们输入文本时  占位符要消失  即隐藏 UITextField 中的占位符也是当输入内容时,占位符placeHolder消失了
    //改变text这个属性 同样会走didSet方法  改变属性在OC里面会走set方法  在swift中就会走didSet方法
    override var text: String? { //这个方法是相对于xib而言的
        
        didSet{
            
            //隐藏占位符  hasText() 是文本有无内容  有就是true  没有就是 false
            placeHolderLabel.hidden = hasText()
            
            
        }
        
        
    }
    
    
    
    
    override init(frame: CGRect, textContainer: NSTextContainer?) {
        
        super.init(frame: frame, textContainer: textContainer)
        
        
        layoutUI ()
        
    }
    
    
    //允许xib使用 这样我们这个类关联上xib后也能使用xib了
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        
        
        layoutUI ()
        
        
    }
    

    
    private func layoutUI () {
        
        //监听textView文字改变时的通知
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "textChange", name: UITextViewTextDidChangeNotification, object: nil)
            
            addSubview(placeHolderLabel)
            
            //  使用手写布局
            placeHolderLabel.translatesAutoresizingMaskIntoConstraints = false
            
            addConstraint(NSLayoutConstraint(item: placeHolderLabel, attribute: .Leading, relatedBy: .Equal, toItem: self, attribute: .Leading, multiplier: 1, constant: 5))
            
            addConstraint(NSLayoutConstraint(item: placeHolderLabel, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1, constant: 8))
            
            addConstraint(NSLayoutConstraint(item: placeHolderLabel, attribute: .Width, relatedBy: .Equal, toItem: self, attribute: .Width, multiplier: 1, constant: -10))
            
        
        
    }
    
    
    //MARK: - 一有内容就隐藏占位符
    @objc private func textChange() {
        
        
        placeHolderLabel.hidden = self.hasText()
        
        
        
    }
    
    
    
    
    //移除通知
    deinit {
        
        
        NSNotificationCenter.defaultCenter().removeObserver(self)
        
        
    }
    
    
}
